home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-09-02 | 3.1 KB | 141 lines | [TEXT/PJMM] |
- unit MyBufferedRead;
-
- interface
-
- const
- min_buffer_size = 128;
- max_buffer_size = 32000;
-
- type
- bufferedReadFile = ptr;
-
- function BufferReadInit (p: bufferedReadFile; size: longInt; refnum: integer): OSErr;
- function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
- function BufferReadChar (p: bufferedReadFile): integer;
- function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
- procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
-
- implementation
-
- const
- buffer_extra = 30;
- max_buffer_size1 = max_buffer_size - 1;
-
- type
- bufferedFile = record
- rn: integer;
- max_buffer: integer;
- bufp, bufmax: integer;
- total: longInt;
- buffer: array[0..max_buffer_size1] of signedByte;
- end;
- bufferedFilePtr = ^bufferedFile;
-
- function BufferReadInit (p: ptr; size: longInt; refnum: integer): OSErr;
- var
- oe: OSErr;
- begin
- with bufferedFilePtr(p)^ do begin
- rn := refnum;
- oe := GetEOF(rn, total);
- max_buffer := size - buffer_extra;
- bufp := 0;
- bufmax := 0;
- end;
- BufferReadInit := oe;
- end;
-
- function FillBuffer (p: bufferedReadFile): OSErr;
- var
- oe: OSErr;
- size: longInt;
- begin
- oe := noErr;
- with bufferedFilePtr(p)^ do begin
- if bufmax - bufp < max_buffer then begin
- if (bufmax - bufp > 0) & (bufp > 0) then
- BlockMove(@buffer[bufp], @buffer, bufmax - bufp);
- bufmax := bufmax - bufp;
- bufp := 0;
- size := max_buffer - bufmax;
- oe := FSRead(rn, size, @buffer[bufmax]);
- bufmax := bufmax + size;
- if (oe = eofErr) and (bufmax > 0) then
- oe := noErr;
- end;
- end;
- FillBuffer := oe;
- end;
-
- function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
- var
- oe: OSErr;
- c: longInt;
- begin
- oe := noErr;
- with bufferedFilePtr(p)^ do begin
- c := bufmax - bufp;
- if c > size then
- c := size;
- BlockMove(@buffer[bufp], @data, c);
- bufp := bufp + c;
- if size > c then begin
- size := size - c;
- oe := FSRead(rn, size, ptr(ord(data) + c));
- size := size + c;
- if (oe = eofErr) and (size > 0) then
- oe := noErr;
- end;
- end;
- BufferRead := oe;
- end;
-
- function BufferReadChar (p: bufferedReadFile): integer;
- var
- oe: OSErr;
- begin
- with bufferedFilePtr(p)^ do begin
- if bufp >= bufmax then
- oe := FillBuffer(p);
- if bufp >= bufmax then
- BufferReadChar := -1
- else begin
- BufferReadChar := BAND(buffer[bufp], $FF);
- bufp := bufp + 1;
- end;
- end;
- end;
-
- function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
- var
- ch: integer;
- begin
- with bufferedFilePtr(p)^ do begin
- repeat
- repeat
- if bufp < bufmax then begin
- ch := BAND(buffer[bufp], $FF);
- bufp := bufp + 1;
- end
- else
- ch := BufferReadChar(p);
- until (ch = c1) or (ch < 0);
- while ch = c1 do
- ch := BufferReadChar(p);
- until (ch = c2) or (ch < 0);
- end;
- BufferIgnoreTil := ch;
- end;
-
- procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
- var
- oe: OSErr;
- begin
- total := bufferedFilePtr(p)^.total;
- with bufferedFilePtr(p)^ do begin
- oe := GetFPos(rn, thru);
- thru := thru - bufmax + bufp;
- end;
- end;
-
- end.